From 3e16c3eb42d8d4cd8d9da656a9740643cca898b9 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Sun, 7 Oct 2012 11:54:30 -0400 Subject: [PATCH] * lisp/window.el (internal--before-save-selected-window) (internal--after-save-selected-window): New functions extracted from save-selected-window. Make sure we return the `alist' we construct. (save-selected-window): Use them. * lisp/textmodes/tex-mode.el (tex-recenter-output-buffer): Use with-selected-window. --- lisp/ChangeLog | 8 ++++++ lisp/textmodes/tex-mode.el | 3 +- lisp/window.el | 56 +++++++++++++++++++++----------------- 3 files changed, 40 insertions(+), 27 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 56295dde2c8..8ccfc789394 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,13 @@ 2012-10-07 Stefan Monnier + * window.el (internal--before-save-selected-window) + (internal--after-save-selected-window): New functions extracted from + save-selected-window. Make sure we return the `alist' we construct. + (save-selected-window): Use them. + + * textmodes/tex-mode.el (tex-recenter-output-buffer): + Use with-selected-window. + * emacs-lisp/autoload.el (make-autoload): Add `cl-defmacro' to the forms that define macros (bug#12593). diff --git a/lisp/textmodes/tex-mode.el b/lisp/textmodes/tex-mode.el index a324daa9283..062f43be57b 100644 --- a/lisp/textmodes/tex-mode.el +++ b/lisp/textmodes/tex-mode.el @@ -2565,8 +2565,7 @@ line LINE of the window, or centered if LINE is nil." (if (null tex-shell) (message "No TeX output buffer") (setq window (display-buffer tex-shell)) - (save-selected-window - (select-window window) + (with-selected-window window (bury-buffer tex-shell) (goto-char (point-max)) (recenter (if linenum diff --git a/lisp/window.el b/lisp/window.el index 41af7f9f44b..f9761366b62 100644 --- a/lisp/window.el +++ b/lisp/window.el @@ -28,6 +28,35 @@ ;;; Code: +(defun internal--before-save-selected-window () + (cons (selected-window) + ;; We save and restore all frames' selected windows, because + ;; `select-window' can change the frame-selected-window of + ;; whatever frame that window is in. Each text terminal's + ;; top-frame is preserved by putting it last in the list. + (apply #'append + (mapcar (lambda (terminal) + (let ((frames (frames-on-display-list terminal)) + (top-frame (tty-top-frame terminal)) + alist) + (if top-frame + (setq frames + (cons top-frame + (delq top-frame frames)))) + (dolist (f frames) + (push (cons f (frame-selected-window f)) + alist)) + alist)) + (terminal-list))))) + +(defun internal--after-save-selected-window (state) + (dolist (elt (cdr state)) + (and (frame-live-p (car elt)) + (window-live-p (cdr elt)) + (set-frame-selected-window (car elt) (cdr elt) 'norecord))) + (when (window-live-p (car state)) + (select-window (car state) 'norecord))) + (defmacro save-selected-window (&rest body) "Execute BODY, then select the previously selected window. The value returned is the value of the last form in BODY. @@ -44,34 +73,11 @@ its normal operation could make a different buffer current. The order of recently selected windows and the buffer list ordering are not altered by this macro (unless they are altered in BODY)." (declare (indent 0) (debug t)) - `(let ((save-selected-window-window (selected-window)) - ;; We save and restore all frames' selected windows, because - ;; `select-window' can change the frame-selected-window of - ;; whatever frame that window is in. Each text terminal's - ;; top-frame is preserved by putting it last in the list. - (save-selected-window-alist - (apply 'append - (mapcar (lambda (terminal) - (let ((frames (frames-on-display-list terminal)) - (top-frame (tty-top-frame terminal)) - alist) - (if top-frame - (setq frames - (cons top-frame - (delq top-frame frames)))) - (dolist (f frames) - (push (cons f (frame-selected-window f)) - alist)))) - (terminal-list))))) + `(let ((save-selected-window--state (internal--before-save-selected-window))) (save-current-buffer (unwind-protect (progn ,@body) - (dolist (elt save-selected-window-alist) - (and (frame-live-p (car elt)) - (window-live-p (cdr elt)) - (set-frame-selected-window (car elt) (cdr elt) 'norecord))) - (when (window-live-p save-selected-window-window) - (select-window save-selected-window-window 'norecord)))))) + (internal--after-save-selected-window save-selected-window--state))))) (defvar temp-buffer-window-setup-hook nil "Normal hook run by `with-temp-buffer-window' before buffer display. -- 2.30.2